package com.atguigu.tingshu.album.service.impl;

import com.atguigu.tingshu.album.mapper.AlbumAttributeValueMapper;
import com.atguigu.tingshu.album.mapper.AlbumInfoMapper;
import com.atguigu.tingshu.album.mapper.AlbumStatMapper;
import com.atguigu.tingshu.album.service.AlbumInfoService;
import com.atguigu.tingshu.common.constant.SystemConstant;
import com.atguigu.tingshu.common.util.AuthContextHolder;
import com.atguigu.tingshu.model.album.AlbumAttributeValue;
import com.atguigu.tingshu.model.album.AlbumInfo;
import com.atguigu.tingshu.model.album.AlbumStat;
import com.atguigu.tingshu.model.album.BaseAttributeValue;
import com.atguigu.tingshu.query.album.AlbumInfoQuery;
import com.atguigu.tingshu.vo.album.AlbumAttributeValueVo;
import com.atguigu.tingshu.vo.album.AlbumInfoVo;
import com.atguigu.tingshu.vo.album.AlbumListVo;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;

import java.math.BigDecimal;
import java.util.List;

@Slf4j
@Service
@SuppressWarnings({"unchecked", "rawtypes"})
public class AlbumInfoServiceImpl extends ServiceImpl<AlbumInfoMapper, AlbumInfo> implements AlbumInfoService {

    @Autowired
    private AlbumInfoMapper albumInfoMapper;
    @Resource
    AlbumAttributeValueMapper albumAttributeValueMapper;
    @Resource
    AlbumStatMapper albumStatMapper;

    @Override
    public void saveAlbumInfo(AlbumInfoVo albumInfoVo) {
        //1 新增专辑表
        AlbumInfo albumInfo = new AlbumInfo();
        BeanUtils.copyProperties(albumInfoVo, albumInfo);
        Long userId = AuthContextHolder.getUserId();
        userId = userId != null ? userId : 1;
        albumInfo.setUserId(userId);

        albumInfo.setTracksForFree(5);
        albumInfo.setSecondsForFree(30);
        albumInfo.setStatus(SystemConstant.ALBUM_STATUS_PASS);
        this.save(albumInfo);
        Long albumId = albumInfo.getId();
        // 2 新增专辑标签表
        List<AlbumAttributeValueVo> albumAttributeValueVoList = albumInfoVo.getAlbumAttributeValueVoList();
        if (!CollectionUtils.isEmpty(albumAttributeValueVoList)) {
            // 2.1对专辑标签属性值遍历
            albumAttributeValueVoList.forEach(albumAttributeValueVo -> {
                AlbumAttributeValue albumAttributeValue = new AlbumAttributeValue();
                BeanUtils.copyProperties(albumAttributeValueVo, albumAttributeValue);
                albumAttributeValue.setAlbumId(albumId);
                this.albumAttributeValueMapper.insert(albumAttributeValue);
            });
        }
        //3 新增专辑统计信息
        initAlbumStat(albumId, SystemConstant.ALBUM_STAT_PLAY);
        initAlbumStat(albumId, SystemConstant.ALBUM_STAT_SUBSCRIBE);
        initAlbumStat(albumId, SystemConstant.ALBUM_STAT_BROWSE);
        initAlbumStat(albumId, SystemConstant.ALBUM_STAT_COMMENT);

    }

//专辑分类列表
    @Override
    public Page<AlbumListVo> findUserAlbumPage(Integer page, Integer limit, AlbumInfoQuery query) {
query.setUserId(AuthContextHolder.getUserId() == null?1:AuthContextHolder.getUserId());
       return this.albumInfoMapper.findUserAlbumPage(new Page<>(page,limit),query);

    }


    @Override
    // 专辑编辑时的回显
    public AlbumInfo getAlbumInfo(Long albumId) {
        // 1 根据专辑id查询专辑
        AlbumInfo albumInfo = this.getById(albumId);

        // 2 根据专辑id查询专辑标签值
        List<AlbumAttributeValue> albumAttributeValues = this.albumAttributeValueMapper.selectList(new LambdaQueryWrapper<>(AlbumAttributeValue.class)
                .eq(AlbumAttributeValue::getAlbumId, albumId));
        albumInfo.setAlbumAttributeValueVoList(albumAttributeValues);
        return albumInfo;
    }

    @Override
    //更新专辑提交按钮
    public void updateAlbumInfo(Long albumId,AlbumInfoVo albumInfoVo) {
        // 1 更新专辑信息表
        AlbumInfo albumInfo = new AlbumInfo();
        BeanUtils.copyProperties(albumInfoVo,albumInfo);
        albumInfo.setId(albumId);
        if (albumInfo.getPayType().equals(SystemConstant.ALBUM_PAY_TYPE_FREE)){
            albumInfo.setPrice(null);
            albumInfo.setPrice(new BigDecimal( 0));

        }


        this.updateById(albumInfo);


        // 2 先删除专辑标签值表
        this.albumAttributeValueMapper.delete(new LambdaQueryWrapper<>(AlbumAttributeValue.class)
                .eq(AlbumAttributeValue::getAlbumId,albumId));
        // 3 在新增专辑标签值
        List<AlbumAttributeValueVo> albumAttributeValueVoList = albumInfoVo.getAlbumAttributeValueVoList();
        if (!CollectionUtils.isEmpty(albumAttributeValueVoList)){
            albumAttributeValueVoList.forEach(albumAttributeValueVo -> {
                AlbumAttributeValue albumAttributeValue = new AlbumAttributeValue();
                BeanUtils.copyProperties(albumAttributeValueVo,albumAttributeValue);
                albumAttributeValue.setAlbumId(albumId);
                this.albumAttributeValueMapper.insert(albumAttributeValue);
            });

        }


    }

    @Override
    //删除专辑 (逻辑删除)
    public void removeAlbumInfo(Long albumId) {
        // 1专辑表
        this.removeById(albumId);
        //2 专辑标签属性性表  !!!!!是  Lambda【Update】Wrapper
        this.albumAttributeValueMapper.delete(new LambdaUpdateWrapper<>(AlbumAttributeValue.class)
                .eq(AlbumAttributeValue::getAlbumId,albumId));
        // 3 标签统计
        this.albumStatMapper.delete(new LambdaUpdateWrapper<>(AlbumStat.class)
                .eq(AlbumStat::getAlbumId,albumId));


    }

    @Override
    public Page<AlbumListVo> findAlbumPage(Integer page, Integer limit) {


        return albumInfoMapper.findAlbumPage(new Page<>(page,limit));
    }

    @Override
    public List<AlbumAttributeValue> findAttributeValuesByAlbumId(Long albumId) {
        List<AlbumAttributeValue> albumAttributeValues = this.albumAttributeValueMapper.selectList(new LambdaQueryWrapper<AlbumAttributeValue>()
                .eq(AlbumAttributeValue::getAlbumId, albumId));
        return albumAttributeValues;
    }

    // 四个状态值 提取一个方法使用
    private void initAlbumStat(Long albumId, String statType) {
        AlbumStat albumStat = new AlbumStat();
        albumStat.setAlbumId(albumId);
        albumStat.setStatNum(0);
        albumStat.setStatType(statType);
        this.albumStatMapper.insert(albumStat);
    }
}
